package main

import "fmt"
/*
类似其它语言中的哈希表或者字典，以key-value形式存储数据
Key必须是支持==或!=比较运算的类型，不可以是函数、map或slice
Map查找比线性搜索快很多，但比使用索引访问数据的类型慢100倍
Map使用make()创建，支持 := 这种简写方式

make([keyType]valueType, cap)，cap表示容量，可省略
超出容量时会自动扩容，但尽量提供一个合理的初始值
使用len()获取元素个数

键值对不存在时自动添加，使用delete()删除某键值对
使用 for range 对map和slice进行迭代操作
 */
func main()  {
	//变量名[keyType]valueType
	var m map[int]string  = map[int]string{0:"I",1:"love",2:"girls "}
	fmt.Println(m,len(m))

	var m1 map[int]string  = make(map[int]string)
	fmt.Println(m1,len(m1))

	m[0]="0"
	m[1]="1"
	fmt.Println(m)
	delete(m,1)
	fmt.Println(m)
//map<key,map>
	var mm map[int]map[int]string  = make(map[int]map[int]string)

	//make仅仅初始化外层map,内层map需要初始化才能使用
	mm[1]=make(map[int]string)
	mm[1][1]="OK"		//key连用

	a:=mm[1][1]
	fmt.Println(a)


	//多返回值，判断map键值对是否存在(被初始化)
	b,ok:=mm[2][1]
	fmt.Println(b,ok)
	if !ok {
		mm[2]=make(map[int]string)
		mm[2][1]="???"
		b1,ok1:=mm[2][1]
		fmt.Println(b1,ok1)
	}
	//i索引，v元素值,都是值引用
	for k,v:= range mm {
		fmt.Println(k,v)
	}

	//map类型的slice
fmt.Println("---------")
	slice_map:=make([]map[int]string,3,6)
//_表示忽略index
	for _,v:=range slice_map{
		fmt.Println(slice_map,v)
	}
fmt.Println("-----------")
	for i,v:=range slice_map{
		v=make(map[int]string)
		v[1]="I"
		slice_map[i]=v
	}
fmt.Println(slice_map)
}
